#include "hwpwm.h"


/**********************************************************************
 * @brief       初始化PWM
 * @param       resolution：PWM占空比分辨率
 *              freq: PWM信号频率
 * @retval      无
 ***********************************************************************/
void hw_pwm_init(uint8_t resolution, uint16_t freq)
{
    //ledc_timer_config_t ledc_timer;                 /* LEDC定时器句柄 */
    //ledc_channel_config_t ledc_channel;             /* LEDC通道配置句柄 */

    /* 配置LEDC定时器 */
    ledc_timer_config_t ledc_timer={
            .duty_resolution = resolution,        /* PWM占空比分辨率 */
            .freq_hz = freq,                      /* PWM信号频率 */
            .speed_mode = LEDC_HWPWM_MODE,          /* 定时器模式 */
            .timer_num = LEDC_HWPWM_TIMER,          /* 定时器序号 */
            .clk_cfg = LEDC_AUTO_CLK             /* LEDC时钟源 */
    };
    ledc_timer_config(&ledc_timer);                 /* 配置定时器 */

    /* 配置LEDC通道 */
    ledc_channel_config_t ledc_channel={
            .gpio_num = LEDC_HWPWM_CH0_GPIO,      /* LED控制器通道对应引脚 */
            .speed_mode = LEDC_HWPWM_MODE,        /* LEDC高速模式 */
            .channel = LEDC_HWPWM_CH0_CHANNEL,    /* LEDC控制器通道号 */
            .intr_type = LEDC_INTR_DISABLE,     /* LEDC失能中断 */
            .timer_sel = LEDC_HWPWM_TIMER,        /* 定时器序号 */
            .duty = 0                          /* 占空比值 */
    };
    ledc_channel_config(&ledc_channel);             /* 配置LEDC通道 */

    ledc_fade_func_install(0);                      /* 使能渐变（该函数不可或缺） */
}

/**
 * @brief       PWM占空比设置
 * @param       duty：PWM占空比
 * @retval      无
 */
void hw_pwm_set_duty(uint16_t duty)
{
    ledc_set_fade_with_time(LEDC_HWPWM_MODE, LEDC_HWPWM_CH0_CHANNEL, duty, LEDC_HWPWM_FADE_TIME);   /* 设置占空比以及渐变时长 */
    ledc_fade_start(LEDC_HWPWM_MODE, LEDC_HWPWM_CH0_CHANNEL, LEDC_FADE_NO_WAIT);                  /* 开始渐变 */

    ledc_set_fade_with_time(LEDC_HWPWM_MODE, LEDC_HWPWM_CH0_CHANNEL, 0, LEDC_HWPWM_FADE_TIME);      /* 设置占空比以及渐变时长 */
    ledc_fade_start(LEDC_HWPWM_MODE, LEDC_HWPWM_CH0_CHANNEL, LEDC_FADE_NO_WAIT);                  /* 开始渐变 */
}




//test

#if 0

void app_main(void)
{
    esp_err_t ret;

    ret = nvs_flash_init();                                         /* 初始化NVS */
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    LED_init();
    usart_init(115200); 
    hw_pwm_init(13, 5000); /* 占空比最大值8191,频率为5k*/
    while(1)
    {
        
        /* 设置占空比 */
        hw_pwm_set_duty(LEDC_HWPWM_DUTY); /* 设置占空比 */
        printf("Hello-ESP32\r\n");
        vTaskDelay(50);
        
    }
}



#endif